home *** CD-ROM | disk | FTP | other *** search
/ Aminet 7 / Aminet 7 - August 1995.iso / Aminet / comm / tcp / AmigaTCP.lha / AmigaTCP / src / tcp.h < prev    next >
C/C++ Source or Header  |  1989-06-24  |  5KB  |  162 lines

  1. /* TCP implementation. Follows RFC 793 as closely as possible */
  2.  
  3. #define    DEF_WND    2048    /* Default receiver window */
  4. #define    NTCB    19    /* # TCB hash table headers */
  5. #define    RETRY    10    /* Retry limit */
  6. #define    BACKOFF    1024    /* Truncation point for backoff algorithm */
  7. #define    DEF_MSS    512    /* Default maximum segment size */
  8. #define    DEF_RTT    5    /* Initial guess at round trip time (5 sec) */
  9. #define    MSL2    30    /* Guess at two maximum-segment lifetimes */
  10. /* Round trip timing parameters */
  11. #define    ALPHA1    7    /* 7/8 when delay is increasing */
  12. #define    ALPHA2    15    /* 15/16 when delay is decreasing */
  13. #define    BETA    2    /* Allow two round trip times before retransmitting */
  14. /* TCP segment header */
  15. struct tcp_header {
  16.     int16 source;    /* Source port */
  17.     int16 dest;    /* Destination port */
  18.     int32 seq;    /* Sequence number */
  19.     int32 ack;    /* Acknowledgment number */
  20.     char offset;    /* Data offset */
  21.     char flags;    /* Flags, data offset */
  22. #define    DSHIFT    4    /* Data offset field */
  23. #define    DMASK    0x0f    /* Mask for normalized data offset field */
  24. #define    URG    0x20    /* URGent flag */
  25. #define    ACK    0x10    /* ACKnowledgment flag */
  26. #define    PSH    0x08    /* PuSH flag */
  27. #define    RST    0x04    /* ReSeT flag */
  28. #define    SYN    0x02    /* SYNchronize flag */
  29. #define    FIN    0x01    /* FINal flag */
  30.     int16 wnd;    /* Receiver flow control window */
  31.     int16 checksum;    /* Header + data checksum */
  32.     int16 up;    /* Urgent pointer */
  33. };
  34.  
  35. /* Format of the Maximum Segment Size option (the only one currently
  36.  * defined in TCP)
  37.  */
  38. struct mss {
  39.     char kind;    /* Must be 2 */
  40. #define    MSS_KIND    2
  41.     char length;    /* Must be 4 */
  42. #define    MSS_LENGTH    4
  43.     int16 mss;    /* The actual value */
  44. };
  45.  
  46. /* Resequencing queue entry */
  47. struct reseq {
  48.     struct reseq *next;    /* Linked-list pointer */
  49.     char tos;        /* Type of service */
  50.     struct tcp_header seg;    /* TCP header */
  51.     struct mbuf *bp;    /* data */
  52.     int16 length;        /* data length */
  53. };
  54. #define    NULLRESEQ    (struct reseq *)NULL
  55.  
  56. /* TCP connection control block */
  57. struct tcb {
  58.     struct tcb *prev;    /* Linked list pointers for hash table */
  59.     struct tcb *next;
  60.  
  61.     struct connection conn;
  62.  
  63.     char state;    /* Connection state */
  64. #define    CLOSED        0
  65. #define    LISTEN        1
  66. #define    SYN_SENT    2
  67. #define    SYN_RECEIVED    3
  68. #define    ESTABLISHED    4
  69. #define    FINWAIT1    5
  70. #define    FINWAIT2    6
  71. #define    CLOSE_WAIT    7
  72. #define    CLOSING        8
  73. #define    LAST_ACK    9
  74. #define    TIME_WAIT    10
  75.  
  76.     char reason;        /* Reason for closing */
  77. #define    NORMAL        0    /* Normal close */
  78. #define    RESET        1    /* Reset by other end */
  79. #define    TIMEOUT        2    /* Excessive retransmissions */
  80. #define    NETWORK        3    /* Network problem (ICMP message) */
  81.  
  82. /* If reason == NETWORK, the ICMP type and code values are stored here */
  83.     char type;
  84.     char code;
  85.  
  86.     /* Send sequence variables */
  87.     struct {
  88.         int32 una;    /* First unacknowledged sequence number */
  89.         int32 nxt;    /* Next sequence num to be sent for the first time */
  90.         int32 ptr;    /* Working transmission pointer */
  91.         int16 wnd;    /* Other end's offered receive window */
  92.         int16 up;    /* Send urgent pointer */
  93.         int32 wl1;    /* Sequence number used for last window update */
  94.         int32 wl2;    /* Ack number used for last window update */
  95.     } snd;
  96.     int32 iss;        /* Initial send sequence number */
  97.  
  98.     /* Receive sequence variables */
  99.     struct {
  100.         int32 nxt;    /* Incoming sequence number expected next */
  101.         int16 wnd;    /* Our offered receive window */
  102.         int16 up;    /* Receive urgent pointer */
  103.     } rcv;
  104.     int32 irs;        /* Initial receive sequence number */
  105.     int16 mss;        /* Maximum segment size */
  106.  
  107.     char retry;        /* Retransmission retry count */
  108.     void (*r_upcall)();    /* Call when "significant" amount of data arrives */
  109.     void (*t_upcall)();    /* Call when ok to send more data */
  110.     void (*s_upcall)();    /* Call when connection state changes */
  111.     char force;        /* We owe the other end an ACK or window update */
  112.     char tos;        /* Type of service (for IP) */
  113.  
  114.     int16 window;        /* Receiver window and send queue limit */
  115.     struct mbuf *rcvq;    /* Receive queue */
  116.     int16 rcvcnt;
  117.  
  118.     struct mbuf *sndq;    /* Send queue */
  119.     int16 sndcnt;        /* Number of unacknowledged sequence numbers on
  120.                  * send queue. NB: includes SYN and FIN, which don't
  121.                  * actually appear on sndq!
  122.                  */
  123.     struct reseq *reseq;    /* Out-of-order segment queue */
  124.  
  125.     struct timer timer;    /* Retransmission timer */
  126.     int32 rttseq;        /* Sequence number being timed */
  127.     int32 srtt;        /* Smoothed round trip time, milliseconds */
  128.  
  129.     int *user;        /* User parameter (e.g., for mapping to an
  130.                  * application control block
  131.                  */
  132. };
  133. #define    NULLTCB    (struct tcb *)NULL
  134. /* TCP statistics counters */
  135. struct tcp_stat {
  136.     int16 runt;        /* Smaller than minimum size */
  137.     int16 checksum;        /* TCP header checksum errors */
  138.     int16 conout;        /* Outgoing connection attempts */
  139.     int16 conin;        /* Incoming connection attempts */
  140.     int16 resets;        /* Resets generated */
  141.     int16 bdcsts;        /* Bogus broadcast packets */
  142. };
  143. extern struct tcp_stat tcp_stat;
  144. #ifndef LATTICE
  145. #define    min(x,y)    ((x)<(y)?(x):(y))
  146. #define max(x,y)    ((x)>(y)?(x):(y))
  147. #endif
  148. extern struct tcb *tcbs[];
  149. extern int32 iss();
  150. struct tcb *lookup_tcb();
  151. struct tcb *create_tcb();
  152. void rehash_tcb(),tcp_output(),tcp_input(),close_self(),dump_seg(),
  153.     setstate();
  154.  
  155. /* TCP primitives */
  156. struct tcb *open_tcp();
  157. int send_tcp(),recv_tcp(),close_tcp(),del_tcp();
  158. void state_tcp(),tcp_dump();
  159.  
  160. extern int16 tcp_mss;
  161. extern int16 tcp_window;
  162.